#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>


//创建一个新的类型
//自定义类型

//struct Student
//{
//	char name[20];
//	int age;
//	float high;
//	float weight;
//	char id[20];
//}s1, s2, s3;//注意创建新的类型的时候，后面分号不要省略
//
//struct Student s4;
////全局变量
//
////s1,s2,s3,s4都是全局变量
//
//
//
//int main()
//{
//	struct Student s5 = { "张三",20,180.0f,75.5f,"2313042332" };//初始化
//	struct Student s6 = { .name = "赵子锐", .age = 20 }; //局部变量
//	//初始化为：结构体变量.成员名
//	printf("%s %d %.1f %.1f %s", s5.name, s5.age, s5.high, s5.weight, s5.id);
//
//	return 0;
//}


//struct S
//{
//	char c;
//	int n;
//};
//
//struct B
//{
//	struct S s;
//	int* p;
//	char arr[10];
//	float sc;
//};
//int main()
//{
//	struct B b = { {'c', 99}, NULL, "zzr", 853.5f };
//
//	printf("%c\n", b.s.c);
//
//	return 0;
//}


//整型提升
/*******************************************************

1.有符号整数提升是按照数据类型的符号位来提升的
2.无符号整数提升，高位补0

*******************************************************/
//int main()
//{
//	char a = 3; // char -- signed char
//	//00000000000000000000000000000011
//	//                        00000011 -- a
//	char b = 127;
//	//00000000000000000000000001111111
//	//                        01111111  -- b
//	char c = a + b;
//	//00000000000000000000000000000011
//	//00000000000000000000000001111111
//	//00000000000000000000000010000010
//	//10000010 - c
//	
//	//%d 以10进制的形式打印有符号的整数
//	//10000010 - c 有符号整数
//	//11111111111111111111111110000010 - 整形提升
//	//10000000000000000000000001111110 - 原码 --- -126
//	printf("%d\n", c); //-126
//	
//	return 0;
//}


//一些例子

//例1：

//int fun()
//{
//	static int count = 1;
//	
//	return count++;  //后置++，是先用后++
//}
//
//int main()
//{
//	int answer = 0;
//	answer = fun() - fun() * fun();
//
//	printf("%d\n", answer);
//
//	return 0;
//}

//int fun()
//{
//	static int count = 1;
//	
//	return ++count;  //前置++是，先++后使用
//}
//
//int main()
//{
//	int answer = 0;
//	answer = fun() - fun() * fun();
//
//	printf("%d\n", answer);
//
//	return 0;
//}
/*********************************************************
该代码看着没问题，大部分编译器的结果相同，但其实是有问题的
只能通过操作符的优先级确定，*在-运算之前，但无法确定函数调用的先后
********************************************************/

//例2：
//不同编译器会有不同的结果
//vs中是12，4
//gcc中是10，4
//int main()
//{
//	int i = 1;
//	int ret = (++i) + (++i) + (++i);
//	
//	printf("%d\n", ret);
//	printf("%d\n", i);
//	
//	return 0;
//}

//例3：
// 结果不确定，后果很危险
// 解决方法：1.加括号
//         2.分开写
//int main()
//{
//	int result = 0;
//	int a, b, c, d, e, f;
//	result = a * b + c * d + e * f;
//	//该表达式在计算的时候，由于*比+的优先级高，只能保证，*的计算是比+早
//	//但优先级并不能决定第三个*比第一个+早执行
//	//两种计算路径
//	//1. a*b c*d e*f a*b+c*d a*b+c*d+e*f
//	//2. a*b c*d a*b+c*d e*f a*b+c*d+e*f
//
//	return 0;
//}
//


//例3：
//int main()
//{
//	int c = 4;
//	int a = 0;
//	a = c + --c;
//	//操作符的优先级只能决定--在+的运算前面，但是没有办法得知
//	//左侧的c在什么时候准备好，是在右操作数之前还是之后求值
//	return 0;
//}